#ifndef __HASHMAP_H
#define __HASHMAP_H

#define TAILLE 15

#define ENTIER 1
#define FLOAT 2
#define BOOL 3
#define COMPLEX 4 //Trouvé dans un exemple
#define TABLEAU 8
#define LABEL 9

#define VEE 0   // ||
#define WEDGE 1 // &&
#define NEG 2   // !
#define POS 3   // 
#define EQ 4    // ==
#define NEQ 5   // !=
#define LEQ 6   // <=
#define GEQ 7   // >=
#define LT 8   // <
#define GT 9   // >

#define CONDOP 256
#define CIF 1
#define CEIF 2
#define CFI 3   // ENDIF
#define CELSE 4
#define CWHILE 5
#define CDO 6
#define CENDWHILE 7
#define CFOR 8
#define CENDFOR 9

#define BOOLOP 512

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Quads.h"

typedef struct strvaleur
{
    char* name;
    union strvalue
    {
        int isFct;
        int integer;
        int boolean;
        float floating;
    }Value;

    int type;
    /**
     *
     * nb de params pour une f°
     * passage par adresse ou valeur
     *
     */
    union specific
    {
        int nbParams[3]; //fonction; 0 input; 1 output; 2 local
        //output contient 0 si pas d'output ou le type s'il y a un arg
        int typePassage; //params
        int bornes[2]; //tableau
        int isConstant; //valeurs Num
    }Specific;

    int isRes;

    union memory
    {
        struct strquad *ptr;
        int sp;
    }Memory;

    struct strvaleur* next;
}Valeur;

typedef struct strHashMap
{
    Valeur *next[TAILLE];
    struct strHashMap* parentMap; //pile des fonctions
    char isChildScope; //si 1 alors droit de monter, sinon 0 si on est dans une fonction
}Hashmap;

Valeur* addInTable(Hashmap *map, char* chaine); //retourne NULL si le symbole est déjà présent dans le scope
Valeur* searchInTable(Hashmap *map, char* chaine); //cherche dans tout les scopes accessibles, retourne NULL si non trouvé
int hashFunc(char* chaine);
void freeTable(Hashmap *map);
Valeur* tmpInt(int val);
Valeur* tmpFloat(float val);
Valeur* tmpBool(int val);

Hashmap* newScopeTable(Hashmap *map, int isChild);

#endif
